home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 3 / 02 / tips & tricks / dup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  2.1 KB  |  102 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6.  
  7. /* Quell- und Zieldatei */
  8. FILE *fp1=NULL, *fp2=NULL;
  9.  
  10. /* Pointer auf Pufferbereich */
  11. char *buf=NULL;
  12.  
  13. /* Routine zum "Aufräumen" */
  14. void aus(void)
  15. {
  16.   if (fp1)
  17.     fclose(fp1);
  18.  
  19.   if (fp2)
  20.     fclose(fp2);
  21.  
  22.   if (buf)
  23.     free(buf);
  24.  
  25.   exit(0);
  26. }
  27.  
  28. int main(int argc, char **argv)
  29. {
  30.  /* String für "system" */
  31.  char del[100];
  32.  /* Puffergröße (Default = 32 KB) */
  33.  unsigned long buffsize = 32768, fsize;
  34.  /* Gelesene und geschriebene Bytes, Laufvariable */
  35.  int size, size1, i;
  36.  /* stat wird benötigt, um Dateigröße zu ermitteln */
  37.  struct stat stdbuf;
  38.  
  39.  /* Anzahl der Parameter gut ? */
  40.  if (argc < 3) {
  41.    printf("Benutzung : %s <sourcefile> "
  42.           "<destinationfile> [Puffergröße"
  43.           " in KB]\n", argv[0]);
  44.    exit(0);
  45.  }
  46.  
  47.  /* Dateien öffnen */
  48.  if (!(fp1 = fopen(argv[1], "r"))) {
  49.    printf("File %s konnte nicht geöffnet"
  50.           " werden !\n", argv[1]);
  51.    aus();
  52.  }
  53.  
  54.  if (!(fp2 = fopen(argv[2], "w"))) {
  55.    printf("File %s konnte nicht geöffnet"
  56.           " werden !\n", argv[2]);
  57.    aus();
  58.  }
  59.  
  60.  /* Wenn angegeben, Puffergröße neu belegen */
  61.  if (argc == 4)
  62.    buffsize = strtol(argv[3], NULL, 10) * 1024;
  63.  
  64.  if (!(buf = malloc(buffsize))) {
  65.     printf("Puffergröße %s KB zu groß ! \n", argv[3]);
  66.     aus();
  67.  }
  68.  
  69.  /* Dateigröße bestimmen */
  70.  stat(argv[1], &stdbuf);
  71.  fsize = stdbuf.st_size;
  72.  
  73.  /* Solange nicht alles gelesen wurde */
  74.  for (i = 0; i * buffsize < fsize; i++) {
  75.    /* lesen */
  76.    size = fread(buf, 1, buffsize, fp1);
  77.  
  78.    /* schreiben */
  79.    size1 = fwrite(buf, 1, size, fp2);
  80.  
  81.    /* Erfolgskontrolle nach dem Schreiben */
  82.    if (size1 != size) {
  83.        /* Bei Fehler : Meldung, Dateien schließen */
  84.        /* und Zieldatei löschen */
  85.        printf("\nSchreibfehler !\n");
  86.        fclose(fp1);
  87.        fclose(fp2);
  88.        strcpy(del, "delete ");
  89.        strcat(del, argv[2]);
  90.        system(del);
  91.        exit(0);
  92.    }
  93.  
  94.    /* Statistik ausgeben */
  95.    printf("%d Prozent\r", (int) ((double) (i + 1)
  96.                        * buffsize / fsize * 100));
  97.    fflush(stdout);
  98.  }
  99.  
  100.  aus();
  101. }
  102.